import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.ticker import FuncFormatter, MultipleLocator

# sns.set(style="white")
# plt.rcParams['font.sans-serif'] = "Simsun"

# 定义函数
def l_e(max_iter, iter, e):
    term1 = ((max_iter - iter) / (max_iter - 1)) ** e
    term2 = (2 - 1 / max_iter)
    term3 = 1 / max_iter
    return term1 * term2 + term3

# 参数设置
max_iter = 100  # 最大迭代次数
iters = np.arange(0, max_iter, 1)  # 从 0 到 max_iter - 1 的迭代次数
e_values = [1, 2]  # e 的取值

# 计算不同 e 值下的 l_e
results = {e: l_e(max_iter, iters, e) for e in e_values}
colors = {1: 'red', 2: 'green'}  # 颜色映射

# 定义纵坐标格式化函数，0.0 显示为 0
def format_y_ticks(value, _):
    if value == 0.0:
        return '0'  # 将 0.0 格式化为 0
    else:
        return f'{value:.1f}'  # 保留一位小数

# 绘图
plt.figure(figsize=(12, 8))  # 设置背景为白色
for e, values in results.items():
    plt.plot(iters, values, label=f'e={e}', color=colors[e], linestyle='-', linewidth=3)

# 设置标题和标签
plt.xlabel("迭代次数", fontsize=16, fontname="SimHei", labelpad=10)
plt.ylabel("l_e的值", fontsize=16, fontname="SimHei", labelpad=15)

# 设置纵坐标为 0, 0.5, 1.0, 1.5, 2.0
plt.gca().yaxis.set_major_locator(MultipleLocator(0.5))  # 设置间隔为 0.5
plt.ylim(0, 2.0)  # 设置 y 轴范围
plt.xlim(0, max_iter)  # 确保 x 轴从 0 开始
plt.xticks(fontsize=14, fontname="Times New Roman")  # 确保刻度为整数
plt.yticks(fontsize=14, fontname="Times New Roman")  # X轴刻度调整
# 设置纵坐标格式
plt.gca().yaxis.set_major_formatter(FuncFormatter(format_y_ticks))

plt.tick_params(axis='both', which='both', length=6, width=1, colors='black')  # 设置刻度线的样式

# 显示网格和图例
plt.grid(False)
plt.legend(fontsize=14,prop={'size': 14, "family": "Times New Roman"})
plt.show()
